package com.chat.socketServer;

import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.Session;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSONObject;
import com.chat.enums.EventName;
import com.chat.enums.EventType;
import com.chat.po.Event;
import com.chat.po.User;
/**
 * 说明：在线用户管理类
 * 时间：2016年7月14日上午11:01:30
 * @author 杨建全
 */
public class OnlineUserManager {
	/**
	 * 当前在线用户的map，key为用户id，value为用户对象
	 */
	private static Map<String,User> onlineUserMap = new ConcurrentHashMap<>();
	private static Map<Session,String> onlineSessionMap = new ConcurrentHashMap<>();
	
	private static Logger logger = Logger.getLogger(OnlineUserManager.class);
	/**
	 * 功能：根据id获取在线用户
	 * 时间：2016年7月14日上午11:03:17
	 */
	public static User getOnlineUserById(String userId){
		return onlineUserMap.get(userId);
	}
	/**
	 * 功能：将一个用添加到在线集合中
	 * 时间：2016年7月14日上午11:06:15
	 */
	public static void addOnlineUser(User u){
		onlineUserMap.put(u.getId(), u);
		onlineSessionMap.put(u.getSocketSession(),u.getId());
	}
	/**
	 * 功能：根据id移除在线用户
	 * 时间：2016年7月14日上午11:08:04
	 */
	public static void removeOnlineUserById(String id){
		User u = onlineUserMap.get(id);
		if (null!=u) {
			onlineUserMap.remove(id);
			onlineSessionMap.remove(u.getSocketSession());
		}
	}
	/**
	 * 功能：给某个用户发送消息
	 * 时间：2016年7月14日上午11:10:34
	 * @author 杨建全
	 * @param uid 用户id
	 * @param msg 消息内容
	 * @param msgType 消息类型
	 */
	public static void sendMsgToUserByUID(String uid,String msg,int msgType){
		User u = getOnlineUserById(uid);
		if (null==u) {
			return;
		}
		//TODO 组装消息
		send(u.getSocketSession(), msg);
	}
	/**
	 * 功能：发送消息
	 * 时间：2016年7月14日下午2:56:30
	 * @author 杨建全
	 * @param session
	 * @param msg
	 */
	public static void send(Session session,String msg){
		try {
			if(session!=null&&session.isOpen()){
				session.getBasicRemote().sendText(msg);
			}
		} catch (Exception e) {
			logger.error(e);
		}
	}
	/**
	 * 功能：广播消息
	 * 时间：2016年7月14日下午4:10:08
	 * @author 杨建全
	 * @param msg
	 */
	public static void sendAll(String msg){
		Collection<Session> sessions =  onlineSessionMap.keySet();
		for (Session session : sessions) {
			send(session, msg);
		}
	}
	/**
	 * 功能：断线处理
	 * 时间：2016年7月14日下午2:44:48
	 * @author 杨建全
	 * @param session
	 */
	public static void logOut(Session session) {
		String id = onlineSessionMap.get(session);
		if (StringUtils.isNotEmpty(id)) {
			removeOnlineUserById(id);
		}
	}
	
	public static void printOnlineUsers(){
		System.out.println("----------------------------------------------------");
		System.out.println("|在线人数："+onlineUserMap.values().size()+"-----------------------------------------|");
		System.out.println("|当前在线用户："+onlineUserMap.values()+"|");
		System.out.println("----------------------------------------------------");
	}
	/**
	 * 功能：获取所有在线用户信息
	 * 时间：2016年7月14日下午4:12:18
	 * @author 杨建全
	 */
	public static Event getAllOnlineUserInfo() {
		Event event = new Event(EventName.NowOnlineUsers, EventType.EVENT);
		JSONObject data = new JSONObject();
		data.put("size", onlineUserMap.size());
		data.put("users", onlineUserMap.values());
		event.setData(data);
		return event;
	}
}
